using UnityEngine;
using System.Collections.Generic;
using System;
using System.Linq;

//定义了一个商店系统类,用于管理商店的状态和行为
[System.Serializable]
public class ShopSystem
{
    // 商店的物品槽列表
    [SerializeField] private List<ShopSlot> _shopInventory;
    public List<ShopSlot> ShopInventory => _shopInventory;

    // 商店的可用金币数量
    [SerializeField] private int _availableGold;
    public int AvailableGold => _availableGold;

    // 商品的购买加价率和出售加价率
    [SerializeField] private float _buyMarkUp;
    public float BuyMarkUp => _buyMarkUp;
    [SerializeField] private float _sellMarkUp;
    public float SellMarkUp => _sellMarkUp;

    // 构造方法，初始化商店的大小、金币数量以及购买和出售的加价率
    public ShopSystem(int size, int gold, float buyMarkUp, float sellMarkUp)
    {
        _availableGold = gold;
        _buyMarkUp = buyMarkUp;
        _sellMarkUp = sellMarkUp;
        SetShopSize(size);
    }

    // 设置商店的大小
    private void SetShopSize(int size)
    {
        _shopInventory = new List<ShopSlot>(size);// 创建一个指定大小的物品槽列表
        for (int i = 0; i < size; i++)
        {
            _shopInventory.Add(new ShopSlot());// 将新创建的物品槽添加到列表中
        }
    }

    // 向商店添加物品
    public void AddToShop(InventoryItemData data, int amount)
    {
        if (ContainsItem(data, out ShopSlot shopSlot))
        {
            shopSlot.AddToStack(amount); // 如果商店已经存在相同的物品,则将物品堆叠数量增加
        }
        else
        {
            var freeSlot = GetFreeSlot(); // 获取一个空闲的物品槽
            freeSlot.AssignItem(data, amount); // 在空闲的物品槽中添加新的物品
        }
    }

    // 获取一个空闲的物品槽
    private ShopSlot GetFreeSlot()
    {
        var freeSlot = _shopInventory.FirstOrDefault(i => i.ItemData == null); // 查找第一个物品槽中没有物品的槽
        if (freeSlot == null)
        {
            freeSlot = new ShopSlot(); // 如果没有空闲槽，则创建一个新的物品槽
            _shopInventory.Add(freeSlot); // 将新创建的物品槽添加到列表中
        }
        return freeSlot;
    }

    // 检查商店是否已经存在某个物品，并返回对应的物品槽 
    public bool ContainsItem(InventoryItemData itemToAdd, out ShopSlot shopSlot)
    {
        shopSlot = _shopInventory.Find(i => i.ItemData == itemToAdd); // 查找物品槽列表中是否存在相同的物品
        return shopSlot != null;
    }
    public void PurchaseItem(InventoryItemData data, int amount)
    {
        // 检查商店是否包含这种物品，如果不包含，直接返回
        if (!ContainsItem(data, out ShopSlot slot)) return;

        // 从物品槽中移除指定数量的物品
        slot.RemoveFromStack(amount);
    }

    public void GainGold(int basketTotal)
    {
        // 将购物车总额添加到可用金币中
        _availableGold += basketTotal;
    }

    //出售物品
    public void SellItem(InventoryItemData itemData, int quantity, int price)
    {
        // 将物品添加到商店中
        AddToShop(itemData, quantity);
        // 减少商店金额
        ReduceGold(price);
    }

    // 减少商店金额
    private void ReduceGold(int price){
         _availableGold -= price;
    }
}
